/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package restaurante.cdp;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;
import restaurante.cdp.enuns.SituacaoMesa;
import restaurante.cdp.enuns.TipoPedido;
import restaurante.cdp.interfaces.EnviadorPedido;
import restaurante.cdp.interfaces.Pedinte;
import restaurante.cdp.interfaces.ResponsavelPagamento;
import restaurante.util.persistencia.ObjetoPersistente;

/**
 *
 * @author a20101bsi0623
 */

@Entity
public class Mesa extends ObjetoPersistente implements Pedinte, EnviadorPedido{
    private Integer numero;
    private Integer lugares;
    private String descricao;
    private List<Pedido> pedidosEspera;
    private List<Pedido> pedidosNaoPagos;
    private SituacaoMesa situacao;

    public Mesa() {
        pedidosEspera = new ArrayList<>();
        pedidosNaoPagos = new ArrayList<>();
        situacao = SituacaoMesa.VAZIA;
        
    }
    
    

    public Integer getNumero() {
        return numero;
    }

    public void setNumero(Integer numero) {
        this.numero = numero;
    }

    public Integer getLugares() {
        return lugares;
    }

    public void setLugares(Integer lugares) {
        this.lugares = lugares;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @OneToMany(cascade= CascadeType.PERSIST, fetch= FetchType.EAGER)
    public List<Pedido> getPedidosEspera() {
        return pedidosEspera;
    }

    public void setPedidosEspera(List<Pedido> pedidosEspera) {
        this.pedidosEspera = pedidosEspera;
    }

    @OneToMany(cascade= CascadeType.PERSIST, fetch= FetchType.EAGER)
    public List<Pedido> getPedidosNaoPagos() {
        return pedidosNaoPagos;
    }

    public void setPedidosNaoPagos(List<Pedido> pedidosNaoPagos) {
        this.pedidosNaoPagos = pedidosNaoPagos;
    }

    @Enumerated(EnumType.STRING)
    public SituacaoMesa getSituacao() {
        return situacao;
    }


    public void setSituacao(SituacaoMesa situacao) {
        this.situacao = situacao;
    }
    
   
    @Override
    public void enviarPedidoCozinha(Pedido p)
    {
        System.out.println("\nMesa: Pedido enviado para a cozinha");
    }

    @Override
    public Pedido pedir(EnviadorPedido responsavel, Produto produto, Integer qte) {
        System.out.println("\nMesa: Fez o pedido");
        Pedido p = new Pedido();
        p.setProduto(produto);
        p.setQuantidade(qte);
        p.setResponsavel(responsavel);
        p.setTipo(TipoPedido.LOCAL);
        this.setSituacao(SituacaoMesa.ESPERANDO);
        this.pedidosEspera.add(p);
        this.pedidosNaoPagos.add(p);
        p.setCliente(this);
        responsavel.enviarPedidoCozinha(p);
        return p;
    }

    @Override
    public Pagamento pagar(ResponsavelPagamento responsavel) {
        System.out.println("\nMesa: Efetuou o Pagamento");
        Pagamento pg = new Pagamento();
        pg.setResponsavel(responsavel);
        pg.setCliente(this);
        pg.setPedidos(this.pedidosNaoPagos);
        for (Pedido pedido : pedidosNaoPagos) {
            for(int i=0; i<pedido.getQuantidade();i++)
            {
                pg.setTotal(pg.getTotal() + pedido.getProduto().getValor());
            }
        }
        this.setPedidosNaoPagos(null);
        this.situacao = SituacaoMesa.VAZIA;
        responsavel.receberPagamento();
        responsavel.computarPagamento();
        return pg;
    }

    @Override
    public void consultaCliente() {
        System.out.println("\n--Mesa--\n>Numero: "+this.getNumero()+"\n>Situacao: "+this.getSituacao());
    }
    
    @Override
    public void consulta() {
        this.consultaCliente();
    }

    @Override
    public void setSituacao(Pedido p) {
        this.setSituacao(SituacaoMesa.OCUPADA);
        this.getPedidosEspera().remove(p);
    }
    
}
